//package com.ruoyi.web.core.config;
//
//
//import java.io.BufferedInputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.FileInputStream;
//import java.io.IOException;
//import java.lang.reflect.Method;
//
///**
// * 自定义ClassLoader
// *
// * @author liuchao
// * @date 2023/3/25
// */
//public class MyClassLoader extends ClassLoader {
//    /**
//     * 负责加载的类所属目录
//     */
//    public String classPath;
//
//    /**
//     * 包名
//     */
//    public String packageName;
//
//    /**
//     * 秘钥
//     */
//    public String secretKey;
//
//    public MyClassLoader(String secretKey, String packageName, String classPath) {
//        this.secretKey = secretKey;
//        this.packageName = packageName;
//        this.classPath = classPath;
//    }
//
//    @Override
//    protected Class<?> findClass(String name) {
//        //获取字节码完整路径
//        String fileName = classPath + name + ".class";
//        ByteArrayOutputStream baos = null;
//        BufferedInputStream bis = null;
//        try {
//            //获取输入流
//            bis = new BufferedInputStream(new FileInputStream(fileName));
//            //获取输出流
//            baos = new ByteArrayOutputStream();
//
//            //读取数据写入输出流
//            int len;
//            byte[] data = new byte[1024];
//            while ((len = bis.read(data)) != -1) {
//                baos.write(data, 0, len);
//            }
//            //获取内存中完整的字节素组数据 （加密的）
//            byte[] encryptByteCodes = baos.toByteArray();
//
//            //解密返回
//            byte[] byteCodes = SecureUtil.aes(secretKey.getBytes()).decrypt(encryptByteCodes);
//            //通过调用defineClass 方法将字节数组转换为class的实例
//            return defineClass(packageName + "." + name, byteCodes, 0, byteCodes.length);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        } finally {
//            try {
//                if (null != baos) {
//                    baos.close();
//                }
//                if (null != bis) {
//                    bis.close();
//                }
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
//        }
//    }
//
//
//    public void encryptClass() {
//        //秘钥
//        String secretKey = "12asdfwe23123212";
//        String className = "Demo";
//        //原字节码
//        byte[] byteCodes = FileUtil.readBytes("/Users/liuchao/Desktop/" + className + ".class");
//        //加密后的字节码
//        byte[] encryptByteCodes = SecureUtil.aes(secretKey.getBytes()).encrypt(byteCodes);
//        //加密后的字节码重新生成新的class文件放入 temp目录下
//        FileUtil.writeBytes(encryptByteCodes, "/Users/liuchao/Desktop/temp/" + className + ".class");
//
//
//    }
//
//    public void decryptClass() {
//        try {
//            String secretKey = "12asdfwe23123212";
//            MyClassLoader classLoader = new MyClassLoader(secretKey, "com.lc", "/Users/liuchao/Desktop/temp/");
//
//            Class clazz = classLoader.loadClass("Demo");
//
//            System.out.println("当前Demo类的加载器为：" + clazz.getClassLoader().getClass().getName());
//            System.out.println("当前Demo类的加载器的父类加载器为：" + clazz.getClassLoader().getClass().getClassLoader().getClass().getName());
//
//            Method method = clazz.getMethod("hello");
//
//            Object obj = clazz.newInstance();
//
//            method.setAccessible(Boolean.TRUE);
//            method.invoke(obj);
//        }catch (Exception e){
//
//        }
//    }
//
//    public static void main(String[] args) throws Exception {
//
//    }
//}
